package com.example.tcp2504;

import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.widget.Button;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;

import org.json.JSONObject;
public class learnMainActivity extends AppCompatActivity {
    private final String TAG = "MainActivity";
    private learnService learnService;
    private boolean isBound = false;


    private TextView statusTextView;

    // 定义一个 ServiceConnection 实例，用于处理绑定和解绑
    private ServiceConnection serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName className, IBinder service) {
            learnService.MyBinder binder = (learnService.MyBinder) service;
            learnService = binder.getService();
            isBound = true;
            Log.d(TAG, "Service connected");
        }

        @Override
        public void onServiceDisconnected(ComponentName arg0) {
            isBound = false;
            Log.d(TAG, "Service disconnected");
        }
    };
    // 定义广播接收器
    private BroadcastReceiver tcpReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String message = intent.getStringExtra(learnService.MESSAGE_KEY);
            /**
             * 确保 UI 更新在主线程上执行
             */
            runOnUiThread(() -> {
                statusTextView.setText(message);
            });
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_learnmain);
        statusTextView = findViewById(R.id.status_text_view);

        /**
         * 学习使用基础的service
         */
        // 绑定到 Service
        Intent intent = new Intent(this, learnService.class);
        bindService(intent, serviceConnection, BIND_AUTO_CREATE);
        /**
         * 启动动服务：
         * 如果 Service 尚未运行，startService 方法会创建并启动 Service。
         * 如果 Service 已经运行，则 startService 方法不会重新创建 Service，但会调用其 onStartCommand 方法。
         */
        startService(intent);

        /**
         * 学习使用intent和Service进行基础通信
         */
        //通过 Intent 将基础类型数据从 Activity 传递到 Service。
        // 创建 JSON 对象
        JSONObject jsonObject = new JSONObject();
        try {
            jsonObject.put("name", "John Doe");
            jsonObject.put("age", 30);
            jsonObject.put("email", "john.doe@example.com");
        } catch (Exception e) {
            e.printStackTrace();
        }
        intent.putExtra("json_object", jsonObject.toString());
        startService(intent);

        /**
         * 学习使用广播和service进行通信
         * LocalBroadcastManager.getInstance(this)
         * LocalBroadcastManager：这是 Android 提供的一个类，用于管理本地广播（即仅在应用内部广播的消息）。
         * 它比全局广播更高效，因为全局广播会跨越不同的应用进程，而本地广播仅在当前应用内部传递消息。
         * getInstance(this)：获取 LocalBroadcastManager 的单例实例。this 是当前的上下文（通常是 Activity 或 Service），
         * 用于初始化 LocalBroadcastManager。
         * /////////////////////////////////
         * 2. registerReceiver(tcpReceiver, new IntentFilter(learnService.ACTION))
         * registerReceiver：注册一个广播接收器，使其能够接收特定的广播消息。
         * tcpReceiver：这是你定义的 BroadcastReceiver 实例，它将处理接收到的广播消息。
         * new IntentFilter(learnService.ACTION)：创建一个 IntentFilter，指定接收器感兴趣的广播消息的类型。
         * learnService.ACTION 是一个字符串常量，表示广播消息的 Action（动作）。
         */
        // 注册广播接收器
        LocalBroadcastManager.getInstance(this).registerReceiver(
                tcpReceiver,
                new IntentFilter(learnService.ACTION)
        );

        /**
         * 学习调用service的方法
         */
        // 找到按钮并设置点击监听器
        Button callServiceButton = findViewById(R.id.call_service_button);
        callServiceButton.setOnClickListener(v -> {
            if (isBound && learnService != null) {
                learnService.doSomething();
            } else {
                Log.d(TAG, "Service is not yet bound. Cannot call doSomething.");
            }
        });


    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 解除绑定
        if (isBound) {
            unbindService(serviceConnection);
            isBound = false;
            Log.d(TAG, "Service unbound");
            // 注销广播接收器
            LocalBroadcastManager.getInstance(this).unregisterReceiver(tcpReceiver);

        }
    }
}